class AppUpdate {
	// 构造函数
	constructor(option = {
		lastVersion: '', // 最新版本号
		inquiry: false, // 询问是否更新
		force: false, // 是否强制更新
		appleId: '', // ios设备需要跳转到App Store，所以需要该产品的appleId
		downloadUrl: '', //android设备可以直接从网址进行下载
	}) {
		this.option = option
		this.progress = 0 // 安装包下载的进度
	}

	// 当前版本号
	static get version() {
		//#ifndef APP-PLUS
		return '0.0.0'
		//#endif

		// #ifdef APP-PLUS
		return plus.runtime.version
		//#endif
	}

	// 客户端平台
	static get platform() {
		return uni.getSystemInfoSync().platform
	}

	// 版本检测更新
	async appUpdate() {
		//#ifndef APP-PLUS
		console.log('您既不是android用户，也不是ios用户，不用更新')
		//#endif

		// #ifdef APP-PLUS
		// 如果lastVersion为空或者等于当前版本号
		if (!this.option.lastVersion || (this.version && this.option.lastVersion === this.version)) {
			uni.showToast({
				icon: 'none',
				position: 'bottom',
				title: '已经是最新版本',
				duration: 2500
			})
			return
		}

		// 如果需要询问是否更新或者已经设定为强制更新
		if (this.option.inquiry || !this.option.force) {
			await this.inquiryDownload();
			return
		}

		await this.downloadApp();
		//#endif
	}

	// android询问是否下载
	inquiryDownload() {
		return new Promise((resolve, reject) => {
			//#ifndef APP-PLUS
			console.log('您既不是android用户，也不是ios用户，不用下载')
			resolve('')
			//#endif

			//#ifdef APP-PLUS
			uni.showModal({
				content: '检测到新版本,是否更新？',
				success: async res => {
					if (res.confirm) {
						console.log('用户点击确定，开始下载新版本');
						await this.downloadApp();
					} else if (res.cancel) {
						console.log('用户点击取消，不将进行更新');
					}

					resolve(true);
				}
			})
			//#endif
		});
	}

	// 下载新版本
	downloadApp() {
		return new Promise(async (resolve, reject) => {
			//#ifndef APP-PLUS
			console.log('您既不是android用户，也不是ios用户，还想跳转到ios的App Store?')
			resolve('')
			//#endif

			//#ifdef APP-PLUS
			if (this.platform === 'ios') {
				this.gotoStore()
			}

			if (this.platform === 'android') {
				let apkInfoStr = await this.fileReader('apkInfo.txt');
				let akpInfo_res = this.isJSON(apkInfoStr)
				console.log('从文件读取到的apk信息：', apkInfoStr, akpInfo_res)

				// 如果没有获取到想要的数据，默认本地没有最新版本，将直接下载
				if (!akpInfo_res.isJSON) {
					let res = await this.downloadNewVersion()
					resolve(res);
				}

				// 如果获取了到想要的数据，还需要判断是不是最新版本
				let t_version = akpInfo_res.content.version
				let t_path = akpInfo_res.content.path

				// 不是最新版
				if (t_version && this.option.lastVersion === t_version) {
					console.log('检测到的安装包不是最新版，还是需要下载啊')
					this.fileWriter('apkInfo.txt', '')
					let res = await this.downloadNewVersion()
					resolve(res);
				}

				plus.runtime.install(t_path, {
					force: true
				}, (e) => {
					console.log('安装成功(为什么不更新缓存文件呢？因为这里是本地的安装包安装成功了，所以不需要更新缓存文件)', e);
				}, async (e) => {
					console.log('安装失败(明明缓存文件里说有，但是实际上并没有，说明用户可能清理过安装包，这时候需要重新下载)', e);
					this.fileWriter('apkInfo.txt', '')
					let res = await this.downloadNewVersion()
					resolve(res);
				});
			}
			//#endif
		});
	}

	gotoStore() {
		//#ifndef APP-PLUS
		console.log('您既不是android用户，也不是ios用户，还想跳转到ios的App Store?')
		//#endif

		//#ifdef APP-PLUS
		if (!this.appleId) {
			console.log('appleId为空，无法跳转至App Store');
			return
		}

		//apple id  在 app conection 上传的位置可以看到  https://appstoreconnect.apple.com/
		plus.runtime.launchApplication({
			action: `itms-apps://itunes.apple.com/cn/app/id${this.appleId}?mt=8`
		}, function(e) {
			console.log('Open system default browser failed: ' + e.message);
		});
		//#endif
	}

	// android下载新版本
	downloadNewVersion() {
		return new Promise((resolve, reject) => {
			//#ifdef APP-PLUS
			let downloadTask = uni.downloadFile({
				url: this.option.downloadUrl,
				success: res => {
					if (res.statusCode === 200) {
						plus.runtime.install(res.tempFilePath, {
							force: true
						}, (e) => {
							console.log('安装成功', e)
							let tmp_content = {
								path: res.tempFilePath,
								version: e.version
							}
							this.fileWriter('apkInfo.txt', JSON.stringify(tmp_content))
							resolve(true);
						}, (e) => {
							console.log('安装失败(这里的失败是最新下载的安装包安装失败了，说明远程地址的安装包不行啊)', e)
							uni.showToast({
								title: '安装包已损坏',
								icon: 'none',
								position: 'bottom'
							})
							resolve(false);
						});
					}
				}
			});

			// 进度条
			let newNum = 0;
			let oldNum = 0;
			downloadTask.onProgressUpdate(res => {
				newNum = res.progress;
				if (newNum != oldNum) {
					this.progress = newNum
					oldNum = res.progress;
				}
			});
			//#endif
			//#ifndef APP-PLUS
			resolve('')
			//#endif
		});
	}

	// 文件读
	fileReader(filename) {
		return new Promise((resolve, reject) => {
			//#ifdef APP-PLUS
			plus.io.requestFileSystem(plus.io.PRIVATE_DOC, function(fobject) {
				// fs.root是根目录操作对象DirectoryEntry
				fobject.root.getFile(filename, {
					create: true
				}, function(fileEntry) {
					fileEntry.file(function(file) {
						var fr = new plus.io.FileReader();
						fr.readAsText(file, 'utf-8');
						fr.onloadend = function(evt) {
							console.log('内容：', evt)
							resolve(evt.target.result)
						}
					});
				});
			});
			//#endif
			//#ifndef APP-PLUS
			resolve('')
			//#endif
		})
	}

	// 文件写
	fileWriter(filename, content) {
		//#ifdef APP-PLUS
		plus.io.requestFileSystem(plus.io.PRIVATE_DOC, function(fobject) {
			// fs.root是根目录操作对象DirectoryEntry
			fobject.root.getFile(filename, {
				create: true
			}, function(fileEntry) {
				fileEntry.file(function(file) {
					// create a FileWriter to write to the file
					fileEntry.createWriter(function(writer) {
						writer.seek(0)
						writer.write(content);
						console.log('写入成功')
					}, function(e) {
						console.log('写入失败')
					});
				});
			});
		});
		//#endif
	}

	// 判断是否为json字符串
	isJSON(str) {
		if (typeof str == 'string') {
			try {
				var obj = JSON.parse(str);
				if (typeof obj == 'object' && obj) {
					return {
						isJSON: true,
						content: obj
					}
				} else {
					return {
						isJSON: false,
						content: str
					}
				}
			} catch (e) {
				return {
					isJSON: false,
					content: str
				}
			}
		}
	}
}

module.exports = AppUpdate;
